Create your flash banner free online
مديريت حافظه در NET

مديريت حافظه در NET

  1)تخصيص حافظه براي نوع داده اي که منبع مورد نظر را ارايه ميدهد. اين تخصيص حافظه با استفاده از دستور newobj در زبان IL صورت ميگيرد که اين دستور از ترجمه دستور new در زبانهايي مثل C# و Visual Basic و ديگر زبانهاي برنامه نويسي ايجاد ميشود.
2)مقداردهي اوليه حافظه براي تنظيم حالت آغازين(Initial state) منابع و قابل استفاده کردن آن. توابع Constructor در اين نوع داده ها مسئول اين تنظيمات براي ايجاد اين حالت آغازين هستند. 
3)استفاده از منابع با دسترسي به اعضاي موجود در نوع داده.
4)از بين بردن حالت کلي منابع براي پاک کردن آن.
5)آزادسازي حافظه. Garbage Collector مسئول مطلق اين مرحله به شمار مي رود.

اين نمونه به ظاهر ساده يکي از ريشه هاي اصلي خطاهاي ايجاد شده در برنامه نويسي به شمار ميرود. مواقع زيادي پيش مي آيد که برنامه نويس آزادسازي يک حافظه را وقتي ديگر مورد نياز نيست فراموش مي کند. مواقع زيادي پيش مي آيد که برنامه نويس از يک حافظه که قبلا آزاد شده استفاده کند.
اين دو باگ برنامه ها از اکثر آنها بدتراند زيرا معمولا برنامه نويس نميتواند ترتيب يا زمان به وجود آمدن اين خطاها را پيش بيني کند. براي ديگر باگها شما ميتوانيد با مشاهده رفتار اشتباه يک برنامه آن را به سادگي تصحيح کنيد. اما اين دو باگ موجب نشت منابع (Resource Leak) (مصرف بيجاي حافظه) و از بين رفتن پايداري اشيا ميشوند که کارايي برنامه را در زمانهاي مختلف تغيير ميدهد. براي کمک به يک برنامه نويس براي تشخيص اين نوع خطاها ابزارهاي ويژه اي مانند Windows Task Manager و System Monitor ActiveX Control و NuMega Bounds Checker و ... طراحي شده اند.
يک مديريت منبع مناسب بسيار مشکل و خسته کننده است. اين مورد تمرکز برنامه نويس را بر روي مطلب اصلي از بين ميبرد. به همين دليل نياز به يک مکانيسم که مديريت حافظه را به بهترين نحو انجام دهد در اين زمينه به وضوح احساس ميشد. در پلتفرم .NET اين امر توسط Garbage Collector انجام ميشود.
Garbage Collection کاملا برنامه نويس را از کنترل استفاده از حافظه و بررسي زمان آزادسازي آن راحت ميکند. اگرچه Garbage Collector درمورد منابع ارائه شده توسط نوع داده در حافظه هيچ چيز نميداند، يعني Garbage Collector نميداند چه طور ميتواند مرحله 4 از موارد بالا را انجام دهد: از بين بردن حالت کلي منابع براي پاک کردن آن. برنامه نويس بايد کدهاي مربوط به اين قسمت را انجام دهد چون او ميداند بايد چه گونه حافظه را به درستي و کاملا آزاد کند. البته Garbage Collector ميتواند در اين زمينه نيز قسمتهايي از کار را براي برنامه نويس انجام دهد.
البته، بيشتر نوع داده ها، مانند Int32، Point ، Rectangle ، String ،ArrayList و SerializationInfo از منابعي استفاده مي کنند که احتياجي به نوع ويژه اي از آزادسازي حافظه ندارند. براي مثال منابع يک شئي از نوع Point به راحتي و با نابود کردن فيلدهاي X و Y در حافظه شيي آزاد ميشود.
از طرف ديگر، يک نوع داده که منابع مديريت نشده اي را ارائه ميدهد، مانند يک فايل، يک ارتباط بانک اظلاعاتي، يک سوکت، يک Bitmap، يک آيکون و مانند اينها هميشه به اجراي مقداري کد ويژه براي آزاد کردن حافظه گرفته شده نياز دارند.
CLR نياز دارد که حافظه تمام منابع از يک heap مخصوص که managed heap ناميده ميشود تخصيص داده شود. اين heap شبيه heap زمان اجراي C است و فقط از يک لحاظ متفاوت است و آن اين است که در اين heap شما هيچ وقت حافظه تخصيص داده شده را آزاد نميکنيد. در حقيقت اشيا موجود در اين heap وقتي ديگر نيازي به آنها نباشد آزاد ميشوند. اين مورد اين سوال را ايجاد ميکند که چگونه managed heap متوجه ميشود که ديگر نيازي به يک شيي خاص نيست؟
چندين الگوريتم از Garbage Collector در حال حاضر در مرحله آزمايش هستند و هر کدام از اين الگوريتمها براي يک محيط خاص و نيز براي کسب بهترين راندمان بهينه سازي شده اند. در اين مقاله روي الگوريتم Garbage Collector استفاده شده در Microsoft .NET Framework CLR متمرکز شده است.
زماني که يک پروسه مقداردهي اوليه(Initialize) ميشود، CLR يک قسمت پيوسته از آدرس حافظه را براي آن اختصاص ميدهد اين آدرس فضاي حافظه managed heap ناميده ميشود. اين heap همچنين يک اشاره گر مخصوص هم دارد که ما از اين به بعد آن را NextObjPtr مي ناميم. اين اشاره گر مکان قرار گيري شيي بعدي را در heap مشخص ميکند. در ابتدا اين اشاره گر به آدرس ابتداي فضاي گرفته شده براي managed heap اشاره ميکند.
دستور newobj در زبان IL باعث ايجاد يک شيي جديد ميشود. بيشتر زبانها از جمله C# و Visual Basic براي درج اين دستور در کد IL عملگر new را در برنامه ارائه ميدهند. اين دستور IL باعث ميشود که CLR مراحل زير را انجام دهد:

1)محاسبه تعداد بايتهاي مورد نياز براي اين نوع داده
2) اضافه کردن بايتهاي مورد نياز براي overhead شيي. هر شيي دو فيلد overhead دارد: يک اشاره گر به جدول تابع و يک SyncBlockIndex. در سيستمهاي 32بيتي، هر کدام از اين فيلدها 32 بيت هستند، که 8 بايت را به هر شيي اضافه مي کند. در سيستم هاي 64 بيتي، هر کدام از اين فيلدها 64 بيت است که 16 بايت را براي هر شيي اضافه مي کند.
3)سپس CLR چک ميکند که حافظه مورد نياز براي شيي جديد در managed heap موجود باشد. اگر فضاي کافي موجود باشد اين شيي در آدرسي که NextObjPtr به آن اشاره ميکند ايجاد ميشود. تابع constructor شيي مذکور فراخواني ميشود (اشاره گر NextObjPtr به عنوان پارامتر this به constructor فرستاده ميشود) و دستور newobj آدرس شيي ايجاد شده را برميگرداند. درست قبل از اينکه آدرس برگردانده شود، NextObjPtr به بعد از شيي ايجاد شده پيشروي ميکند و مثل قبل آدرسي که بايد شيي بعدي در آن قرار گيرد را در خود نگه ميدارد.


نظرات شما عزیزان:

نام :
آدرس ایمیل:
وب سایت/بلاگ :
متن پیام:
:) :( ;) :D
;)) :X :? :P
:* =(( :O };-
:B /:) =DD :S
-) :-(( :-| :-))
نظر خصوصی

 کد را وارد نمایید:

 

 

 

عکس شما

آپلود عکس دلخواه:





مطالب قبلي





Copyright © 2009-20010 Loxblog.com All Rights Reserved . Designed by Loxblog.com

amoozesh-osn

سید امیر محمد میرصفی

amoozesh-osn

http://amoozesh-osn.loxblog.com

وبلاگ تخصصی سیستم عامل شبکه

مديريت حافظه در NET

وبلاگ تخصصی سیستم عامل شبکه

به وبلاگ من خوش آمدید .:Operation System Net:.

وبلاگ تخصصی سیستم عامل شبکه

ابزار پرش به بالا